Xceed Toolkit Plus for WPF v4.6 Documentation
Selecting all Data Items in a Group

The following example demonstrates how to select all the data items contained in a group by adding them to a grid's selected-items collection when a group-header control is pressed. In the case where a group contains child groups, all the data items in the child groups will also be selected.

XAML
Copy Code
  <Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
    <Grid.Resources>
      <xcdg:DataGridCollectionViewSource x:Key="cvs_orders"
                                    Source="{Binding Source={x:Static Application.Current},
                                                        Path=Orders}">
        <xcdg:DataGridCollectionViewSource.GroupDescriptions>
          <xcdg:DataGridGroupDescription PropertyName="ShipCountry"/>
          <xcdg:DataGridGroupDescription PropertyName="ShipCity"/>
        </xcdg:DataGridCollectionViewSource.GroupDescriptions>
      </xcdg:DataGridCollectionViewSource>
    <Style TargetType="{x:Type xcdg:GroupHeaderControl}">
      <EventSetter Event="PreviewMouseLeftButtonDown"
                   Handler="SelectRows"/>
    </Style>
  </Grid.Resources>
    <xcdg:DataGridControl x:Name="OrdersGrid"
                        ItemsSource="{Binding Source={StaticResource cvs_orders}}"/>
  </Grid>
VB.NET
Copy Code
Private Sub SelectRows( ByVal sender As Object, ByVal e As MouseButtonEventArgs )
  Dim groupHeaderControl As GroupHeaderControl = TryCast( sender, GroupHeaderControl );
  If groupHeaderControl Is Nothing Then
    Return;
  End If
  Dim context As DataGridContext = DataGridControl.GetDataGridContext( groupHeaderControl )
  Dim header As GroupHeaderFooterItem = TryCast( context.GetItemFromContainer( grouHeaderControl, GroupHeaderFooterItem )
  If Not header.Equals( GroupHeaderFooterItem.Empty ) Then
    Dim group As CollectionViewGroup = context.GetParentGroupFromItem( header )
    If Not group Is Nothing Then
      For Each item As Object In group.Items
        If TypeOf item Is CollectionViewGroup Then
          Me.SelectRecurse( context, CType( item, CollectionViewGroup ) )
        Else
          context.SelectedItems.Add( item )
        End If
      Next item
    End If
  End If
End Sub
Private Sub SelectRecurse( ByVal context As DataGridContext, ByVal group As CollectionViewGroup )
  For Each item As Object In group.Items
    If TypeOf item Is CollectionViewGroup Then
      Me.SelectRecurse( context, CType( item, CollectionViewGroup ) )
    Else
      context.SelectedItems.Add( item )
    End If
  Next item
End Sub
C#
Copy Code
private void SelectRows( object sender, MouseEventArgs e )
{
GroupHeaderControl groupHeaderControl = sender as GroupHeaderControl;
if( groupHeaderControl == null )
  return;
DataGridContext context = DataGridControl.GetDataGridContext( groupHeaderControl );
GroupHeaderFooterItem header = ( GroupHeaderFooterItem )context.GetItemFromContainer( groupHeaderControl );
if( !header.Equals( GroupHeaderFooterItem.Empty ) )
{
  CollectionViewGroup group = context.GetParentGroupFromItem( header );
  if( group != null )
  {
    foreach( object item in group.Items )
    {
      if( item is CollectionViewGroup )
      {
        this.SelectRecurse( context, ( CollectionViewGroup )item );
      }
      else
      {
        context.SelectedItems.Add( item );
      }
    }
  }
}
}
private void SelectRecurse( DataGridContext context, CollectionViewGroup group )
{
foreach( object item in group.Items )
{
  if( item is CollectionViewGroup )
  {
    this.SelectRecurse( context, ( CollectionViewGroup )item );
  }
  else
  {
    context.SelectedItems.Add( item );
  }
}
}